package com.jm.day24.a_jdbctx;

import com.jm.day24.utils.JdbcUtils;
import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTxDemo {

    /**
     * 使用JDBC进行事务管理（Statement）
     *
     * @throws SQLException
     */
    @Test
    public void demo1() {
        Connection conn = null;
        Statement stmt = null;

        try {
            //获取数据库连接
            conn = JdbcUtils.getConnection();
            //开启事务
            conn.setAutoCommit(false);
            //创建sql执行平台
            stmt = conn.createStatement();
            //执行sql
            int update = stmt.executeUpdate("update account set money = money - 500 where username = 'zhangsan'");
            //手动创建一个异常
            //int i = 1/0;

            //关闭事务:提交事务
            conn.commit();

        } catch (Exception e) {
            System.out.println("出现异常,事务回滚");

            //关闭事务:回滚事务
            try {
                conn.rollback();
            } catch (SQLException throwables) {
            }
        } finally {
            //释放资源
            JdbcUtils.closeResource(conn, stmt, null);
        }
    }


    /*
     * 使用JDBC进行事务管理(PreparedStatement)
     * */
    @Test
    public void demo2() {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            //获取数据库连接
            conn = JdbcUtils.getConnection();

            //开启事务
            conn.setAutoCommit(false);

            //创建sql执行平台
            pstmt = conn.prepareStatement("update account set money = money - ? where username = ?");

            //给sql语句设置参数
            pstmt.setDouble(1, 500d);
            pstmt.setString(2, "zhangsan");

            //执行sql
            int update = pstmt.executeUpdate();

            //手动创建一个异常
            //int i = 1/0;

            //处理执行结果
            System.out.println("执行正常,事务要提交:" + update);

            //关闭事务:回滚事务
            conn.commit();

        } catch (Exception e) {
            System.out.println("出现异常,事务回滚");
            //关闭事务：回滚事务
            try {
                conn.rollback();
            } catch (Exception e1) {
            }
        } finally {
            //释放资源
            JdbcUtils.closeResource(conn, pstmt, null);
        }
    }

}
